package org.example.ItemCF.src.recommend;


import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;

import java.io.IOException;

/**
 * Reducer类：将相同用户的项目偏好聚合在一起。
 */
public class Step1ToUserVectorReducer extends Reducer<IntWritable, Text, IntWritable, Text> {
    private final static Text v = new Text();

    /**
     * 对于每个用户，将其所有的项目偏好聚合为一个字符串。
     *
     * @param key 用户的唯一标识
     * @param values 包含用户所有项目偏好的集合，每个偏好是一个字符串
     * @param context 用于输出聚合后的用户项目偏好和用户标识
     * @throws IOException 当发生I/O错误时抛出
     * @throws InterruptedException 当执行被中断时抛出
     */
    @Override
    public void reduce(IntWritable key, Iterable<Text> values, Context context)
            throws IOException, InterruptedException {
        // 构建用户项目向量，将所有项目偏好以逗号分隔连接成一个字符串
        StringBuilder sb = new StringBuilder();
        for (Text value : values) {
            sb.append("," + value.toString());
        }
        // 移除第一个逗号，确保字符串格式正确
        v.set(sb.toString().replaceFirst(",", ""));
        // 输出用户标识和聚合后的项目偏好
        context.write(key, v);
    }

}
